﻿#ifndef _NET_API_H_
#define _NET_API_H_

#include "tools.h"
#include "socket.h"

#undef htons
#undef htonl
#undef ntohs
#undef ntohl
#define htons(v) x_htons(v)
#define htonl(v) x_htonl(v)
#define ntohl(v) x_ntohl(v)
#define ntohs(v) x_ntohs(v)

char *x_inet_ntoa(struct x_in_addr in);
uint32_t x_inet_addr(const char *str);
int x_inet_pton(int family, const char *strptr, void *addrptr);
const char *x_inet_ntop(int family, const void *addrptr, char *strptr, size_t len);
#undef inet_ntoa
#undef inet_addr
#undef inet_pton
#undef inet_ntop

/**
 * @brief 将ip地址转化为字符串
 * @param in ip地址
 * @return 字符串形式的ip地址
 */
#define inet_ntoa(in) x_inet_ntoa(in)
/**
 * @brief 将字符串转换为特定格式的ip地址
 * @param str 字符串形式的ip地址
 * @return 以32bit表示的ip地址
 */
#define inet_addr(str) x_inet_addr(str)
/**
 * @brief 将字符串转换为特定格式的ip地址
 * @param str 字符串形式的ip地址
 * @return 以32bit表示的ip地址
 */
#define inet_pton(family, strptr, addrptr) x_inet_pton(family, strptr, addrptr);
/**
 * @brief 将ip地址从网络地址格式转换为字符串
 * @param family 协议类型
 * @param addrptr 网络地址格式的ip地址
 * @param strptr 字符串形式的ip地址
 * @param len  字符串长度
 */
#define inet_ntop(family, addrptr, strptr, len) x_inet_ntop(family, addrptr, strptr, len);

#undef socket
#undef scokaddr_in
#undef sockaddr
#undef sendto
#undef recvfrom
#undef setsockopt
#undef connect
#undef close
#undef send
#undef recv
#undef bind

#define socket(family, type, protocol) x_socket(family, type, protocol)
#define sockaddr_in x_sockaddr_in
#define sockaddr x_sockaddr
#define sendto(s, buf, len, flags, dest, dest_len) x_sendto(s, buf, len, flags, dest, dest_len)
#define recvfrom(s, buf, len, flags, from, fromlen) x_recvfrom(s, buf, len, flags, from, fromlen)
#define setsockopt(s, level, optname, optval, len) x_setsocketopt(s, level, optname, optval, len);
#define close(x) x_close(x)
#define connect(s, addr, addr_len) x_connect(s, addr, addr_len)
#define send(s, buf, len, flags) x_send(s, buf, len, flags)
#define recv(s, buf, len, flags) x_recv(s, buf, len, flags)
#define bind(s, addr, len) x_bind(s, addr, len)

#endif